/*
 * @Author: your name
 * @Date: 2021-06-29 09:19:41
 * @LastEditTime: 2021-07-14 16:36:49
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \vue-hr-project\src\store\modules\user.js
 */

// 引入登录接口
import { login, getUserInfo, getUserDetailById } from '@/api/user'
// 引入存入本地的所有方法
import { setToken, getToken, removeToken } from '@/utils/auth'

// 引入清空路由系统的方法
import { resetRouter } from '@/router'
export default {
  namespaced: true, // 开启命名空间
  // 放置响应式数据
  state: {
    token: getToken() || '', // 这个初始值和后端返回的格式保持统一
    userInfo: {} // 用于存放用户数据
  },
  // 放置修改响应式数据的方法
  mutations: {
    // 修改 token
    setToken(state, token) {
      state.token = token
      // 存入本地
      setToken(token)
    },
    // 移除token
    removeToken(state) {
      state.token = ''
      removeToken()
    },
    // 操作用户数据
    setUserInfo(state, userInfo) {
      state.userInfo = userInfo
    },
    // 清除用户信息
    removeUserInfo(state) {
      state.userInfo = {}
    }
  },
  // 异步操作 + 提交 mutations函数
  actions: {
    // 获取 token
    asyncSetToken(ctx, payload) {
      // console.log(payload)
      return new Promise((resolve, reject) => {
      // payload 将来调用action函数时传下来的接口参数data
        login(payload).then(res => {
        // 调用mutation函数
          ctx.commit('setToken', res.data)
          // 数据返回之后resolve
          resolve()
        })
      })
    },
    // 获取用户数据
    asyncSetUserInfo(ctx, payload) {
      return new Promise((resolve, reject) => {
        // 1. 发送异步请求
        getUserInfo().then(res => {
          // 2. 调用 mutations函数    ctx.commit('setUserInfo')
          // 有了用户id 之后  获取用户头像
          // console.log(res)
          getUserDetailById(res.data.userId).then(newRes => {
            // 将新数据和老数据做一个组合, 一起添加到 userInfo
            ctx.commit('setUserInfo', { ...res.data, ...newRes.data })
            resolve(res)
          })
        })
      })
      // 这个接口往前 依赖于登录之后的 token
      //        往后 需要保证用户信息拿到之后才能跳转到首页
    },
    // 移除用户信息  登出
    asyncRemoveUserInfo(ctx) {
      // 如果业务需要调用登录接口的话先调用接口
      // 清空本地存储的用户信息(调用一个mutation函数)
      ctx.commit('removeToken')
      ctx.commit('removeUserInfo')
      // 这里进行路由清理操作
      // 1. 清空一下已经在Vuex中存放的menusList数据  菜单栏
      ctx.commit('menus/clearMenuList', [], { root: true })
      // 2. 清空路由系统  路由系统
      resetRouter()
    }
  }
}

